from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.views import View
# Create your views here.
"""
实现图片验证
前端
    拼接一个url ,img会发起请求
    url=http://ip:port/image_codes/uuid/
后端 
    请求     接收路由中的uuid
    业务逻辑  生成图片验证码和图片二进制.通过redis将图片验证码保存起来
    响应 返回图片的二进制
    
    步骤 1.接受uuid
        2.生成图片二进制与图片验证码
        3.通过redis吧图片验证码保存起来
        4.返回图片验证码
"""
class imageid(View):
    def get(self,request,uuid):
        # 1.接受uuid
        # 2.生成图片二进制与图片验证码 使用老师提供的项目代码(在libs中captcha)
        from libs.captcha.captcha import captcha
        # 通过python的特性可以在多返回值的情况下 使用如下方法接受 text:验证码 ,image:图片二进制
        text,image=captcha.generate_captcha()
        # 3.通过redis吧图片验证码保存起来
        # 进行redis的链接
        from django_redis import get_redis_connection
        # get_redis_connection方法中要输入sitting中的redis库名
        redis_cli=get_redis_connection('code')
        # 指令操作
        # setex(name,time,value) name:key value:value time:最大幸存时间
        redis_cli.setex(uuid,100,text)
        # 4.返回图片二进制
        # content_type的语法形式是 大类/小类 如 图片/png  content_type是MIME类型
        return HttpResponse(image,content_type='image/jpeg')


"""
1.注册
我们提供免费开发测试，【免费开发测试前，请先 注册 成为平台用户】。咨询在线客服


2.绑定测试号
免费开发测试需要在"控制台—管理—号码管理—测试号码"绑定 测试号码 。

3.开发测试
开发测试过程请参考 短信业务接口 及 Demo示例 / sdk参考（新版）示例。Java环境安装请参考"新版sdk"。


4.免费开发测试注意事项
    1.免费开发测试需要使用到"控制台首页"，开发者主账户相关信息，如主账号、应用ID等。

    2.免费开发测试使用的模板ID为1，具体内容：【云通讯】您的验证码是{1}，请于{2}分钟内正确输入。其中{1}和{2}为短信模板参数。

    3.测试成功后，即可申请短信模板并 正式使用 。

debug 模式就是调试模式
debug+断点配合使用 这样我们可以看到程序执行的过程

添加断点 在函数体的第一行添加
"""
from random import randint
from libs.yuntongxun.sms import CCP
from django_redis import get_redis_connection
class ver_mobile(View):
    def get(self,request,mobile):
        obj=request.GET
        code=obj.get("image_code")
        uuid=obj.get("image_code_id")
        if not all([code,uuid]):
            return JsonResponse({'code':400,'errmsg':'参数不全'})
        redis_cli=get_redis_connection('code')
        redis_image_code=redis_cli.get(uuid)
        if redis_image_code is None :
            return JsonResponse({'code': 400, 'errmsg': '图片验证码已过期'})
        if redis_image_code.decode().lower()!=code.lower():return JsonResponse({'code':400,'errmsg':'图片验证码错误'})
        # 实现避免频繁操作
        send_flage = redis_cli.get("sent_flage_%s"%mobile)
        if(send_flage is not None):
            return JsonResponse({'code':400,'errmsg':'请不要频繁操作'})
        sms_code='%06d'%randint(0,999999)
        # 在redis中只要发起一次redis请求(如下两行就是两个请求),redis就会产生一个链接,当请求执行结束redis自动断开连接
        # 总的来说就是有几个请求就有几个链接,并且无须断开连接因为redis会自动断开
        # 这种模式在大型网页中会严重影响redis的效率,使得redis被浪费,因此引入管道技术,使多个redis请求共享同一个链接
        # # 一般实现
        # redis_cli.setex(mobile,300,sms_code)
        # redis_cli.setex("sent_flage_%s"%mobile,60,1)
        # 管道实现
        # 1.新建一个管道
        pipeline=redis_cli.pipeline()
        # 2.管道收集指令
        pipeline.setex(mobile,100,sms_code)
        pipeline.setex("sent_flage_%s"%mobile,60,1)
        # 3.管道执行指令
        """
        由于发送短信较为耗时所以我们要通过celery实现异步通信 即程序在发送短信的同时可以干其他的事
        """

        pipeline.execute()
        # 一般用法
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)
        # 引入celery后的用法
        from celery_tasks.sms.tasks import celery_send_sms_code
        #delay 的参数等同于 任务(函数) 的参数
        celery_send_sms_code.delay(mobile,sms_code)
        return JsonResponse({'code':0,'errmsg':'ok'})
